#ifndef __POWER_CAN_H__
#define __POWER_CAN_H__

#include "FreeRTOS.h"
#include "queue.h"

#include "stdint.h"
#include "utils.h"

#ifdef __cplusplus
extern "C" {
#endif

#define REG75020S

#define SET_TIMEOUT                     300

#define PWR_RECV_TIMEOUT                (1 << 0)

#define PWR_MAX_OUT_VOL                 7500        /* 最高输出电压，精度0.1，扩大10倍 */
#define PWR_MIN_OUT_VOL                 1000        /* 最低输出电压，精度0.1，扩大10倍 */
#define PWR_MAX_OUT_CURR                200         /* 最高输出电流，精度0.1，扩大10倍 */
#define PWR_MIN_OUT_CURR                10          /* 最低输出电流，精度0.1，扩大10倍 */

#ifdef REG75020S
#define CHARGE_ADDR                     0xF0
#define CHARGE_STATE_ADDR               0x00
#define CHARGE_AC_ADDR                  0x00
#define POWER_ADDR                      0x3F
#else
#define CHARGE_ADDR                     0xF0
#define POWER_ADDR                      0x01
#endif
#define DEVICE_ID_SINGLE                0x0A
#define DEVICE_ID_GROUP                 0x0B

#define READ_SYS_VOLTAGE_CMD            0x01            /* 读取系统电压、系统电流 浮点型*/
#define READ_AC_VOLTAGE_CMD             0x06            /* 读取AC侧的电压 */
#define READ_SYS_TOTAL_VOLTAGE_CMD      0x08            /* 读取系统总电压 mv */
#define READ_MAX_VOLTAGE_CMD            0x0a            /* 最大电压、最大电流、额定功率 */
#define READ_EXT_VOLTAGE_CMD            0x0c            /* 外部电压、允许电流 */
#define READ_SYS_STATE_CMD              0x04            /* 读取系统状态 */
#define SET_POWER_ON                    0x1A            /* 设置系统开关机 */
#define SET_SYS_TOTAL_VOLTAGE_CMD       0x1B            /* 设置模块电压、模块总电流 */
#define SET_SYS_VOLTAGE_CMD             0x1C            /* 设置模块电压、模块电流 */

#define PWR_SET_IDLE_STATE              (1 << 0u)
#define PWR_SET_VOL_CURR_STATE          (1 << 1u)
#define PWR_SET_POWER_STATE             (1 << 2u)

#define PWR_POWER_ON                    0
#define PWR_POWER_OFF                   1

typedef struct
{
    uint32_t canid;
    uint8_t buf[8];
} pwr_msg_t;

typedef union
{
    uint32_t canid;
    struct
    {
        uint32_t src_addr : 8;
        uint32_t dest_addr : 8;
        uint32_t cmd : 6;
        uint32_t dev_id : 4;
        uint32_t err_code : 3;
    } id;
} id_t;

typedef struct
{
    struct
    {
        int status;
        int enable;
    } set;

    timer_t timer[1];
    QueueHandle_t power_q;
    pwr_msg_t *msg;
} pwr_t;
extern pwr_t pwr;

/**
 * @brief 模块 N 状态表 2
 */
typedef union
{
    uint8_t buf[1];
    struct
    {
        int lp : 1;          /* 限制功率状态 */
        int repeat_id : 1;   /* ID重复 */
        int curr_no_avg : 1; /* 电流严重不均衡 */
        int phase_loss : 1;  /* 缺相 */
        int unbalance : 1;   /* 不平衡输入 */
        int in_unvol : 1;    /* 输入欠压 */
        int in_over_vol : 1; /* 输入过压 */
        int pfc_off : 1;     /* PFC侧处于关机状态 */
    } data;
} pwr_sta_2_t;

/**
 * @brief 模块 N 状态表 1
 */
typedef union
{
    uint8_t buf[1];
    struct
    {
        int dc_off : 1;             /* DC侧处于关机状态 */
        int fault_alarm : 1;        /* 故障告警 */
        int protect_alarm : 1;      /* 保护告警 */
        int fan_alarm : 1;          /* 风扇故障 */
        int over_temp : 1;          /* 过温告警 */
        int out_over_vol_alarm : 1; /* 输出过压告警 */
        int wk_in_en : 1;           /* WALK-IN 使能 */
        int conn_alarm : 1;         /* 模块通信中断告警 */
    } data;
} pwr_sta_1_t;

/**
 * @brief 模块 N 状态表 0
 */
typedef union
{
    uint8_t buf[1];
    struct
    {
        int out_sc : 1;     /* 输出短路 */
        int : 1;            /* 保留 */
        int conn_fault : 1; /* 内部通信故障 */
        int in_abn : 1;     /* 输入或母线异常 */
        int sleep : 1;      /* 模块休眠 */
        int out_abn : 1;    /* 放电异常 */
        int : 1;            /* 保留 */
        int : 1;            /* 保留 */
    } data;
} pwr_sta_0_t;

int power_init(void);
void on_power_received_from_isr(int chn, pwr_msg_t *msg);
int set_pwr_on(void);
int pwr_read_state(void);
int pwr_read_sys_voltage(void);
int pwr_read_ac_voltage(void);
int set_pwr_out_voltage_curr(int vol, int curr);
int pwr_set_fsm(pwr_t *const set);
#ifdef __cplusplus
}
#endif
#endif                  /* __POWER_CAN_H__ */



